// El ancho es el ancho de cada una de las imagenes
function RectanguloSprite(x, y, ancho, alto, numImgs) {
	this.x = x;
	this.y = y;
	this.ancho = ancho;
	this.alto = alto;
	this.numImgs = numImgs;
}

function Rui(archivoImg, rectIzq, rectSubirIzq, rectBrazoArmado, rectBrazoDesarmado, rectBrazoArcoTrasero, rectCuerpoArco, velocidadHoriz, velocidadVert) {
	this.contextoMovimiento = canvasMovimiento.getContext("2d");
	this.imagen = new Image();
	this.isReady = false;
	var that = this;
	this.imagen.onload = function(){ 
		that.isReady = true;
	}
	this.imagen.src = archivoImg;
	this.rectIzq = rectIzq;
	this.rectSubirIzq = rectSubirIzq;
	this.rectBrazoArmado = rectBrazoArmado;
	this.rectBrazoDesarmado = rectBrazoDesarmado;
	this.rectBrazoArcoTrasero = rectBrazoArcoTrasero;
	this.rectCuerpoArco = rectCuerpoArco;
	this.velocidadHoriz = velocidadHoriz;
	this.velocidadVert = velocidadVert;
	// this.gradosArco = 360;
	this.gradosArco = 0;
		
	this.setPosicion = function(punto) {
		this.posX = punto.x;
		this.posY = punto.y;
	}
	
	this.setPosicion(pantalla.getPosicionInicial());
	this.paso = 0;
	this.incrementoFrame = 1;

	this.frame = 0;
	this.estado = ESTADO_DERECHA;
		
	this.cambioImagenes = function() {
		this.paso = 0;
		this.incrementoFrame = 1;
		this.frame = 0;
	}
	
	this.avanzaImagen = function(numImgs) {
		this.paso = (this.paso + 1)% 3;
		if (this.paso == 0)
			this.frame = this.frame + this.incrementoFrame;
		if (this.frame == numImgs-1)
			this.incrementoFrame = -1;
		else if (this.frame < 1) 
			this.incrementoFrame = 1;
	}
		
	this.actualizarEstado = function() {
		var posXNueva;
		var PosYNueva;
		var tipo;
		if (dispararFlecha) {
			dispararFlecha = false;
			var archivo = "imagenes/mapa7.png";
			var rectanguloIzq = new RectanguloSprite(275,128,65,10,1);
			var rectanguloDer = new RectanguloSprite(202,127,66,10,1);
			if (pantalla.escalaReducida) {
				archivo = "imagenes/mapa7_reducida.png";
				rectanguloIzq = new RectanguloSprite(165,76,40,6,1);
				rectanguloDer = new RectanguloSprite(121,76,40,6,1);
			}
			if (this.estado == ESTADO_ARCO_ARMADO_DERECHA) {
				sprites[sprites.length] = new Flecha(archivo, rectanguloIzq, rectanguloDer, this.gradosArco, this.posX + this.rectCuerpoArco.ancho * 0.5, this.posY + this.rectCuerpoArco.alto * 0.45, ESTADO_DERECHA);
				this.estado = ESTADO_ARCO_DESARMADO_DERECHA;
			}
			else if (this.estado == ESTADO_ARCO_ARMADO_IZQUIERDA){
				sprites[sprites.length] = new Flecha(archivo, rectanguloIzq, rectanguloDer, this.gradosArco, this.posX + this.rectCuerpoArco.ancho * 0.5, this.posY + this.rectCuerpoArco.alto * 0.45, ESTADO_IZQUIERDA);
				this.estado = ESTADO_ARCO_DESARMADO_IZQUIERDA;
			}
		}
		else if (arcoArmado) {
			if (this.estado != ESTADO_ARCO_ARMADO_DERECHA && this.estado != ESTADO_ARCO_ARMADO_IZQUIERDA 
				 && this.estado != ESTADO_ARCO_DESARMADO_DERECHA && this.estado != ESTADO_ARCO_DESARMADO_IZQUIERDA)
				// this.gradosArco = 360;
				this.gradosArco = 0;
			if (this.estado == ESTADO_DERECHA || this.estado == ESTADO_ARCO_DESARMADO_DERECHA)
				this.estado = ESTADO_ARCO_ARMADO_DERECHA;
			else if (this.estado == ESTADO_IZQUIERDA || this.estado == ESTADO_ARCO_DESARMADO_IZQUIERDA)
				this.estado = ESTADO_ARCO_ARMADO_IZQUIERDA;
			// if (teclaPulsada == ARRIBA && this.gradosArco<405)
			if (teclaPulsada == ARRIBA && this.gradosArco<45)
				this.gradosArco++;
			//else if (teclaPulsada == ABAJO && this.gradosArco>315)
			else if (teclaPulsada == ABAJO && this.gradosArco>-45)
				this.gradosArco--;
		} 
		else {
			// Manda la tecla espacio, si está pulsada no tenemos en cuenta el resto y el estado es arco armado
			switch (teclaPulsada) {
				case IZQUIERDA:
					posXNueva = this.posX - this.velocidadHoriz;
					var res = pantalla.moverA(this.posX, this.posY, posXNueva, this.posY);
					if (res == MOVER_OK || res > 0) {
						if (this.estado != ESTADO_IZQUIERDA) {
							this.estado = ESTADO_IZQUIERDA;
							this.cambioImagenes();
						}
						else
							this.avanzaImagen(this.rectIzq.numImgs);
						if (res == MOVER_OK)
							this.posX = posXNueva;
						else
							this.posX = res;
					}	
				break;
				case DERECHA:
					posXNueva = this.posX + this.velocidadHoriz;
					var res = pantalla.moverA(this.posX, this.posY, posXNueva, this.posY);
					if (res == MOVER_OK || res > 0) {
						if (this.estado != ESTADO_DERECHA) {
							this.estado = ESTADO_DERECHA;
							this.cambioImagenes();
						}
						else
							this.avanzaImagen(this.rectIzq.numImgs);
						if (res == MOVER_OK)
							this.posX = posXNueva;
						else
							this.posX = res;
					}
				break;
				case ARRIBA:
					posYNueva = this.posY - this.velocidadVert;
					var res = pantalla.moverA(this.posX, this.posY, this.posX, posYNueva);
					if (res == MOVER_OK || res > 0) {
						tipo = pantalla.getTipoSegmento(this.posX, posYNueva);
						if (tipo == VERTICAL_DER && this.estado != ESTADO_ARRIBA_DERECHA) {
							this.estado = ESTADO_ARRIBA_DERECHA;		
							this.cambioImagenes();
						} 
						else if (tipo == VERTICAL_IZQ && this.estado != ESTADO_ARRIBA_IZQUIERDA) {							
							this.estado = ESTADO_ARRIBA_IZQUIERDA;
							this.cambioImagenes();
						}
						else
							this.avanzaImagen(this.rectSubirIzq.numImgs); 
						if (res == MOVER_OK)
							this.posY = posYNueva;
						else
							this.posY = res;
					}						
				break;
				case ABAJO:
					posYNueva = this.posY + this.velocidadVert;
					var res = pantalla.moverA(this.posX, this.posY, this.posX, posYNueva);
					if (res == MOVER_OK || res > 0) {
						tipo = pantalla.getTipoSegmento(this.posX, posYNueva);
						if (tipo == VERTICAL_DER && this.estado != ESTADO_ARRIBA_DERECHA) {							
							this.estado = ESTADO_ARRIBA_DERECHA;
							this.cambioImagenes();
						} 
						else if (tipo == VERTICAL_IZQ && this.estado != ESTADO_ARRIBA_IZQUIERDA) {							
							this.estado = ESTADO_ARRIBA_IZQUIERDA;
							this.cambioImagenes();
						} 
						else
							this.avanzaImagen(this.rectSubirIzq.numImgs);
						if (res == MOVER_OK)
							this.posY = posYNueva;
						else
							this.posY = res;
					}						
				break;	
			}
		}				
	} // Fin actualizarEstado
	
	this.drawDatosSprite = function(rectSprite, x, y) {
		this.contextoMovimiento.drawImage(this.imagen, 
						this.frame * rectSprite.ancho, rectSprite.y, 
						rectSprite.ancho, rectSprite.alto, 
						x, y, 
			    		rectSprite.ancho, rectSprite.alto);
	}
			
	this.dibujarArcoArmadoIzquierda = function(armado) {
		var radianes = this.gradosArco * Math.PI / 180;
		this.contextoMovimiento.translate(this.posX + this.rectCuerpoArco.ancho * 0.59, this.posY + this.rectCuerpoArco.alto * 0.53);
		this.contextoMovimiento.rotate(radianes);
		this.contextoMovimiento.drawImage(this.imagen,
			this.rectBrazoArcoTrasero.x, this.rectBrazoArcoTrasero.y, 
			this.rectBrazoArcoTrasero.ancho, this.rectBrazoArcoTrasero.alto,
			-this.rectBrazoArcoTrasero.ancho * 1.25, -this.rectBrazoArcoTrasero.alto * 0.45,
			this.rectBrazoArcoTrasero.ancho, this.rectBrazoArcoTrasero.alto);
		this.contextoMovimiento.setTransform(1,0,0,1,0,0);
		this.contextoMovimiento.drawImage(this.imagen, 
			this.rectCuerpoArco.x, this.rectCuerpoArco.y,
			this.rectCuerpoArco.ancho, this.rectCuerpoArco.alto,
			this.posX,this.posY,
			this.rectCuerpoArco.ancho,this.rectCuerpoArco.alto);
		this.contextoMovimiento.translate(this.posX + this.rectCuerpoArco.ancho * 0.59, this.posY + this.rectCuerpoArco.alto * 0.53);
		this.contextoMovimiento.rotate(radianes);
		if (armado)
			this.contextoMovimiento.drawImage(this.imagen,
				this.rectBrazoArmado.x, this.rectBrazoArmado.y, 
				this.rectBrazoArmado.ancho, this.rectBrazoArmado.alto, 
				-this.rectBrazoArmado.ancho * 0.76, -this.rectBrazoArmado.alto * 0.5,
				this.rectBrazoArmado.ancho, this.rectBrazoArmado.alto);
		else
			this.contextoMovimiento.drawImage(this.imagen,
				this.rectBrazoDesarmado.x, this.rectBrazoDesarmado.y, 
				this.rectBrazoDesarmado.ancho, this.rectBrazoDesarmado.alto, 
				-this.rectBrazoDesarmado.ancho * 0.76, -this.rectBrazoDesarmado.alto * 0.5,
				this.rectBrazoDesarmado.ancho, this.rectBrazoDesarmado.alto);
	}
	
	this.dibujarArcoArmadoDerecha = function(armado) {
		var radianes = this.gradosArco * Math.PI / 180;
		this.contextoMovimiento.scale(-1,1);
		this.contextoMovimiento.translate(-this.posX - this.rectCuerpoArco.ancho * 0.46, this.posY + this.rectCuerpoArco.alto * 0.53);		
		this.contextoMovimiento.rotate(radianes);
		this.contextoMovimiento.drawImage(this.imagen,
			this.rectBrazoArcoTrasero.x, this.rectBrazoArcoTrasero.y, 
			this.rectBrazoArcoTrasero.ancho, this.rectBrazoArcoTrasero.alto,
			-this.rectBrazoArcoTrasero.ancho * 1.25, -this.rectBrazoArcoTrasero.alto * 0.45,
			this.rectBrazoArcoTrasero.ancho, this.rectBrazoArcoTrasero.alto);
		this.contextoMovimiento.setTransform(1,0,0,1,0,0);
		this.contextoMovimiento.scale(-1,1);
		this.contextoMovimiento.drawImage(this.imagen,
			this.rectCuerpoArco.x, this.rectCuerpoArco.y,
			this.rectCuerpoArco.ancho, this.rectCuerpoArco.alto,
			-this.posX-this.rectCuerpoArco.ancho, this.posY,
			this.rectCuerpoArco.ancho, this.rectCuerpoArco.alto);
		this.contextoMovimiento.translate(-this.posX - this.rectCuerpoArco.ancho * 0.46, this.posY + this.rectCuerpoArco.alto * 0.53);
		this.contextoMovimiento.rotate(radianes);		
		if (armado)
			this.contextoMovimiento.drawImage(this.imagen,
				this.rectBrazoArmado.x, this.rectBrazoArmado.y, 
				this.rectBrazoArmado.ancho, this.rectBrazoArmado.alto,
				-this.rectBrazoArmado.ancho * 0.76, -this.rectBrazoArmado.alto * 0.5,
				this.rectBrazoArmado.ancho, this.rectBrazoArmado.alto);
		else
			this.contextoMovimiento.drawImage(this.imagen,
				this.rectBrazoDesarmado.x, this.rectBrazoDesarmado.y, 
				this.rectBrazoDesarmado.ancho, this.rectBrazoDesarmado.alto,
				-this.rectBrazoDesarmado.ancho * 0.76, -this.rectBrazoDesarmado.alto * 0.5,
				this.rectBrazoDesarmado.ancho, this.rectBrazoDesarmado.alto);
	}
	
	this.drawImage = function() {
		if(this.isReady){
			this.contextoMovimiento.save();
			switch (this.estado) {
				case ESTADO_IZQUIERDA:					
						this.drawDatosSprite(rectIzq, this.posX, this.posY);
			    	break;
			    case ESTADO_DERECHA:
			    		this.contextoMovimiento.scale(-1, 1);
			    		this.drawDatosSprite(rectIzq, -rectIzq.ancho-this.posX, this.posY);
			    	break;
			    case ESTADO_ARRIBA_IZQUIERDA:					
						this.drawDatosSprite(rectSubirIzq, this.posX, this.posY);
			    	break;
			    case ESTADO_ARRIBA_DERECHA:
			    		this.contextoMovimiento.scale(-1,1);
			    		this.drawDatosSprite(rectSubirIzq, -rectSubirIzq.ancho-this.posX, this.posY);
			    	break;
			    case ESTADO_ARCO_ARMADO_IZQUIERDA:
			    		this.dibujarArcoArmadoIzquierda(true);
			    	break;			    		
			    case ESTADO_ARCO_ARMADO_DERECHA:
			    		this.dibujarArcoArmadoDerecha(true);
			    	break;
			    case ESTADO_ARCO_DESARMADO_IZQUIERDA:
			    		this.dibujarArcoArmadoIzquierda(false);
			    	break;
   			    case ESTADO_ARCO_DESARMADO_DERECHA:
			    		this.dibujarArcoArmadoDerecha(false);
			    	break;
			}    	
			this.contextoMovimiento.restore();
		}		
	}
	
}

